package com.cdc.views;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;

import com.cdc.customview.R;

/**
 * ProjectName：CusetomView
 * DESC: (类描述)
 * Created by chendongchu 2019\1\4 0004
 * updateName:(修改人名称)
 * updateTime:(修改时间)13:32
 * updateDesc:(修改内容)
 */
public class TextView extends View {
    private int mTextColor;
    private float mTextSize;
    private int mGravity;
    private String mText;
    private Paint mPaint;
    private int mWidth;
    private int mHeight;
    private Rect mBounds;


    //在代码中实例化的时候执行
    public TextView(Context context) {
        this(context,null);
        Log.e(Temp.TAG,"TextView(Context context)");
    }
    //在XML布局文件中使用的时候执行，并且是没有使用Style来定义要使用的属性
    public TextView(Context context, @Nullable AttributeSet attrs) {
        super(context,attrs);
        init(context,attrs);
        Log.e(Temp.TAG,"TextView(Context context, @Nullable AttributeSet attrs)");
    }
    //在XML布局文件中使用并且指定了style的时候执行
    public TextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        Log.e(Temp.TAG,"TextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr)");

    }

    private void init(Context context,@Nullable AttributeSet attrs){
        // 使用context对象获得我们自定义的属性的值，attrs是我们xml中使用的属性集合，其中包括属性名和属性值等相关信息，后面是我们自定义的属性，也就是我们定义的declare-styleable。
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.TextView);

        // 使用相应的方法获取各个类型属性的值，第二个参数是获取不到属性值默认的属性值。
        mTextColor = typedArray.getColor(R.styleable.TextView_textColor, Color.BLACK);
        System.out.println("mTextColor = " + mTextColor +"------defColor="+Color.BLACK);

        mTextSize = typedArray.getDimension(R.styleable.TextView_textSize, 12);
        System.out.println("mTextSize = " + mTextSize +"-----defDimension = " + 12);

        mGravity = typedArray.getInt(R.styleable.TextView_gravity, 0);
        System.out.println("mGravity = " + mGravity +"-----defAnInt = " + 0);

        mText = typedArray.getString(R.styleable.TextView_text);
        System.out.println("mText = " + mText);

        // 没啥，google推荐的，使用完及时释放
        typedArray.recycle();
        // 创建一个画笔，我们要在界面上画出相应的东西，都需要靠这支笔。
        mPaint = new Paint();
        // 设置抗锯齿
        mPaint.setAntiAlias(true);
        mPaint.setTextSize(mTextSize);
        mBounds = new Rect();

        mPaint.getTextBounds(mText,0,mText.length(), mBounds);




        mWidth = mBounds.width();
        mHeight = mBounds.height();
        /**
         *
         *  mWidth=405,mHeight=54,bottom=12,top=-42,left=2,right=407
         *
         *  (0,2)  (0,407)
         *
         *
         *
         *
         */
        Log.e(Temp.TAG,"mWidth="+mWidth+",mHeight="+mHeight+",bottom="+mBounds.bottom+",top="+mBounds.top+",left="+mBounds.left+",right="+mBounds.right);
    }

    public TextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        // top 1 || left 3
        float startx = 0;
        float starty = mBounds.height();

        Paint.FontMetricsInt fontMetrics = mPaint.getFontMetricsInt();

        int baseline = (getMeasuredHeight() - fontMetrics.bottom + fontMetrics.top) / 2 - fontMetrics.top;

        // center
        if (mGravity == 0){
            startx = getMeasuredWidth()/2-mBounds.width()/2;
            starty = getMeasuredHeight()/2-mBounds.height()/2;
        }else if (mGravity == 2){ // bottom
            starty = getMeasuredHeight();
        }else if (mGravity == 4){ // right
            startx = getMeasuredWidth()-mBounds.width();
        }else if (mGravity == 5){ // center_horizontal
            startx = getMeasuredWidth()/2-mBounds.width()/2;
        }else if (mGravity == 6){ // center_vertical
            starty = getMeasuredHeight()/2-mBounds.height()/2;
        }

        // 使用canvas类的drawText方法将我们的文字画到屏幕上。
        canvas.drawText(mText, startx, starty, mPaint);


        if (mText != null && mText.length() > 0) {
            int len = mText.length();
            float[] widths = new float[len];
            mPaint.getTextWidths(mText, widths);
            for (int j = 0; j < len; j++) {
               int tempInt=(int) Math.ceil(widths[j]);

            }
        }



        //1. 粗略计算文字宽度
        Log.e(Temp.TAG, "measureText1=" + mPaint.measureText(mText));

        //2. 计算文字所在矩形，可以得到宽高
        Rect rect2 = new Rect();
        mPaint.getTextBounds(mText, 0, mText.length(), rect2);
        int w = rect2.width();
        int h = rect2.height();
        Log.e(Temp.TAG, "w=" +w+"  h="+h);

        //3. 精确计算文字宽度
        int textWidth = getTextWidth(mPaint, mText);
        Log.e(Temp.TAG, "textWidth=" + textWidth);


        canvas.save();
        mPaint.setColor(Color.GREEN);
        canvas.drawRect(mBounds,mPaint);
        canvas.restore();



    }

    public static int getTextWidth(Paint paint, String str) {
        int iRet = 0;
        if (str != null && str.length() > 0) {
            int len = str.length();
            float[] widths = new float[len];
            paint.getTextWidths(str, widths);
            for (int j = 0; j < len; j++) {
                iRet += (int) Math.ceil(widths[j]);
            }
        }
        return iRet;
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int widthSize = MeasureSpec.getSize(widthMeasureSpec);

        // 指定了精确值，也就是设置了绝对大小，10dp这种
        if (widthMode == MeasureSpec.EXACTLY){
            mWidth = widthSize;
        }else{
            // 使用我们的画笔来测量文字的大小，然后加上左边padding和右边padding值，来算出我们想要的宽度
            widthSize= mBounds.width() + getPaddingLeft() + getPaddingRight();

            // 等于这个模式就相当wrap_content，我们要找最小值
            if (widthMode == MeasureSpec.AT_MOST){
                // 让默认的宽度和计算出的宽度做对比，哪个小使用哪个，就是尽可能的小
                widthSize = Math.min(mWidth, widthSize);
            }
        }

        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int heightSize = MeasureSpec.getSize(heightMeasureSpec);

        // 指定了精确值，也就是设置了绝对大小，10dp这种
        if (heightMode == MeasureSpec.EXACTLY){
            mHeight = heightSize;
        }else{
            // 使用我们的画笔来测量文字的大小，然后加上左边padding和右边padding值，来算出我们想要的宽度
            heightSize= mBounds.height() + getPaddingTop()+ getPaddingBottom();

            // 等于这个模式就相当wrap_content，我们要找最小值
            if (heightMode == MeasureSpec.AT_MOST){
                // 让默认的宽度和计算出的宽度做对比，哪个小使用哪个，就是尽可能的小
                heightSize = Math.min(mHeight, heightSize);
            }
        }
        setMeasuredDimension(widthSize,heightSize);
        Log.e(Temp.TAG,"widthSize="+widthSize+",heightSize="+heightSize);
    }


}
